/*
 * DataAccess.java
 *
 * Un semplice strato di astrazione sulla sorgente dati
 * Utilizza il pattern singleton
 *
 */
package it.univaq.iw.jweb.data;

import it.univaq.iw.jweb.utils.SecurityHelpers;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.servlet.ServletException;

/**
 *
 * @author IngegneriaDelWeb
 */
public class DataAccess {

    private static DataAccess instance = null;

    public synchronized static DataAccess getInstance() throws ServletException {
        if (instance == null) {
            instance = new DataAccess();
        }
        return instance;
    }
    private Connection c = null;
    private PreparedStatement sUtente, sNomeGruppo, sNomeUtente, sNomeAzienda, sServizi, sCurriculumCandidato, sCurriculumUtente, sCodFiscale, sCurriculumById, aEsperienzaLavorativa, sIdSettoreLavorativo, sEsperienzeLavorativeByIdCurriculum;
    private PreparedStatement sEsperienzaLavorativa, sIdTitoloDiStudio, sIstruzioneByIdCurriculum, sIstruzione, sPatente, sPatentiByIdCurriculum, sIdLingua, sLingua, sLingueByIdCurriculum, sCapacitaCompetenzaByIdCurriculum, sIdCapacitaCompetenza;
    private PreparedStatement sPreferenze, sCurriculum, sSesso, sAziendaUtente, sProfilo,sProfiloAzienda,sProfiloRicerca, sIstruzioneRichiesta,sTitoloById,sPreferenzaLavorativaAzienda,sPreferenzaRichiesta,sSettoreLavorativoById;
    private PreparedStatement sAutomuniti,sVoto,sCurriculumByPeriodo,sCurriculumBySettoreStudio,sDataVisualizzazioneAzienda,sDataModificaCurriculum,sDataVisitaCurriculum,uDataVisualizzazioneAzienda;
    private PreparedStatement sAziendaByPI,sCandidatoByCF,sLingueRichieste,sNomeLinguaById,sDateDiNascita,sCurriculumBySettoreLavorativo,sCurriculumByTitoloStudio,sCurriculumByTipoImpiego,sCurriculumByProvincia,sCurriculumByRegione,sCurriculumByLingue;
    private PreparedStatement sCapacitaCompetenzaById, sMadrelingua, sCandidatoByMail, sAccrediti, aziendaAccreditata, accreditaAzienda,aPreferenzaCandidato,aEsperienzaRichiesta;
    private PreparedStatement aUtente, aCandidato, aAzienda, aUtenteCandidato, aUtenteAzienda, aUtenteGruppo, aCurriculum, aCurriculumCandidato, aIstruzione, aPatente, aLingua, aCapacitaCompetenza, aCompetenzeAggiuntive, aFoto;
    private PreparedStatement aPreferenzaLavorativa, uPreferenzaLavorativa, aProfiloRicerca, aIstruzioneRichiesta, aPreferenzaRichiesta,aLingueRichieste;
    private PreparedStatement gSettoriLavorativi, gTitoli, gPatenti, gLingue, gNomeLingua, gFoto,dUtente,dCandidato,aDataVisualizzazioneAzienda,sCurriculumVisti;
    private PreparedStatement eCurriculum, cCurriculum, mCurriculum, dPatenti, dEsperienze, dTitoli, dLingue, dCapacitaCompetenza, eAzienda, aDataCurriculum, dProfiloRicerca, dPreferenzaLavorativa;

    private DataAccess() throws ServletException {

        try {

            Class.forName("com.mysql.jdbc.Driver");

            c = DriverManager.getConnection("jdbc:mysql://localhost/jobweb", "root", "nonlaso");

            /***************************** SELECT *****************************/
            sUtente = c.prepareStatement("SELECT email,password FROM utente WHERE email = ? AND password = MD5(?) "); //OK
            sNomeGruppo = c.prepareStatement("SELECT id_gruppo FROM privilegi WHERE email_utente = ? "); //OK
            sNomeUtente = c.prepareStatement("SELECT nome FROM candidato LEFT JOIN utente_candidato ON codice_fiscale = cod_f WHERE email_utente = ? "); //OK
            sNomeAzienda = c.prepareStatement("SELECT rag_sociale FROM persona_giuridica LEFT JOIN utente_azienda ON utente_azienda.p_iva = persona_giuridica.p_iva WHERE email_utente = ? "); //OK
            sServizi = c.prepareStatement("SELECT nome, descrizione FROM servizio LEFT JOIN gruppi_servizi ON id = id_servizio WHERE id_gruppo = ? "); //OK
            sCurriculumCandidato = c.prepareStatement("SELECT id FROM curriculum WHERE nome = ? AND cognome = ? AND data_di_nascita = ? AND indirizzo = ? AND citta = ? AND cap = ? AND provincia = ? AND recapito_telefonico = ? AND email = ? "); //OK
            sCurriculumUtente = c.prepareStatement("SELECT id_curr FROM curriculum_candidato LEFT JOIN utente_candidato ON utente_candidato.cod_f = curriculum_candidato.cod_f WHERE email_utente = ? "); //OK
            sCodFiscale = c.prepareStatement("SELECT cod_f FROM utente_candidato WHERE email_utente = ? "); //OK
            sAziendaUtente = c.prepareStatement("SELECT p_iva FROM utente_azienda WHERE email_utente = ? ");
            sCurriculumById = c.prepareStatement("SELECT * FROM curriculum WHERE id = ? "); //OK
            sPatentiByIdCurriculum = c.prepareStatement("SELECT * FROM patenti_candidato WHERE id_curr = ? "); //OK
            sEsperienzeLavorativeByIdCurriculum = c.prepareStatement("SELECT livello,incarico,data_inizio,data_fine,datore,nome FROM esperienza_lavorativa LEFT JOIN settore_lavorativo ON id_sett_lav = id WHERE id_curr = ? "); //OK
            sIstruzioneByIdCurriculum = c.prepareStatement("SELECT istituto,nome,data_cons,voto,settore,titolo FROM titoli_studio LEFT JOIN istruzione ON id_tit_studio = id WHERE id_curr = ? "); //OK
            sLingueByIdCurriculum = c.prepareStatement("SELECT * FROM conoscenza_lingue WHERE id_curr = ? "); //OK
            sCapacitaCompetenzaByIdCurriculum = c.prepareStatement("SELECT * FROM competenze_aggiuntive WHERE id_curr = ? "); //OK
            sCandidatoByCF = c.prepareStatement("SELECT * FROM candidato WHERE codice_fiscale = ?");
            sAziendaByPI = c.prepareStatement("SELECT * FROM persona_giuridica WHERE p_iva = ? ");

            sProfilo = c.prepareStatement("SELECT id FROM profilo_ricerca WHERE p_iva = ? ");
            sIdSettoreLavorativo = c.prepareStatement("SELECT * FROM settore_lavorativo WHERE nome = ? "); //OK
            sSettoreLavorativoById = c.prepareStatement("SELECT * FROM settore_lavorativo WHERE id = ? "); //OK
            sIdTitoloDiStudio = c.prepareStatement("SELECT * FROM titoli_studio WHERE titolo = ? "); //OK
            sPreferenze = c.prepareStatement("SELECT * FROM pref_lavorative WHERE id = ? ");
            sProfiloRicerca = c.prepareStatement("SELECT * FROM profilo_ricerca WHERE p_iva = ? ");
            sTitoloById = c.prepareStatement("SELECT * FROM titoli_studio WHERE id = ? ");

            sEsperienzaLavorativa = c.prepareStatement("SELECT * FROM esperienza_lavorativa WHERE data_inizio = ? AND id_curr = ? AND id_sett_lav = ? "); //OK
            sIstruzione = c.prepareStatement("SELECT * FROM istruzione WHERE data_cons = ? AND id_curr = ? AND id_tit_studio = ? "); //OK
            sPatente = c.prepareStatement("SELECT * FROM patenti_candidato WHERE data_conseguimento = ? AND id_curr = ? AND tip_pat = ? "); //OK
            sIdLingua = c.prepareStatement("SELECT * FROM lingue WHERE nome = ? "); //OK
            sLingua = c.prepareStatement("SELECT * FROM conoscenza_lingue WHERE id_curr = ? AND id_lingue = ? "); //OK
            sIdCapacitaCompetenza = c.prepareStatement("SELECT id FROM capacita_competenze WHERE sociali = ? AND organizzative = ? AND informatiche = ? AND tecniche = ? AND artistiche = ? AND altro = ? "); //OK
            sCapacitaCompetenzaById = c.prepareStatement("SELECT * FROM capacita_competenze LEFT JOIN competenze_aggiuntive ON id = id_cap_comp WHERE id_curr = ? ");
            sPreferenzaRichiesta = c.prepareStatement("SELECT * FROM esperienza_richiesta WHERE id_prof = ? ");
            sDateDiNascita = c.prepareStatement("SELECT id,data_di_nascita FROM curriculum ");
            sCurriculumBySettoreLavorativo = c.prepareStatement("SELECT id_curr FROM esperienza_lavorativa LEFT JOIN settore_lavorativo ON id = id_sett_lav WHERE nome = ? ");
            sCurriculumByTitoloStudio = c.prepareStatement("SELECT id_curr FROM istruzione LEFT JOIN titoli_studio ON id_tit_studio = id WHERE titolo = ?");
            sCurriculumByTipoImpiego = c.prepareStatement("SELECT id_curr FROM curriculum_candidato LEFT JOIN pref_lavorative ON id = cod_f WHERE tipo_impiego = ? ");
            sCurriculumByProvincia = c.prepareStatement("SELECT id_curr FROM curriculum_candidato LEFT JOIN pref_lavorative ON id = cod_f WHERE prov = ? ");
            sCurriculumByRegione = c.prepareStatement("SELECT id_curr FROM curriculum_candidato LEFT JOIN pref_lavorative ON id = cod_f WHERE regione = ? ");
            sCurriculumByLingue = c.prepareStatement("SELECT id_curr FROM conoscenza_lingue LEFT JOIN lingue ON id_lingue = id WHERE nome = ? ");
            sAutomuniti = c.prepareStatement("SELECT id FROM curriculum WHERE automunito = ? ");
            sVoto = c.prepareStatement("SELECT id_curr,voto FROM istruzione ");
            sCurriculumByPeriodo = c.prepareStatement("SELECT id_curr,data_inizio,data_fine FROM esperienza_lavorativa ");
            sCurriculumBySettoreStudio = c.prepareStatement("SELECT id_curr,settore FROM istruzione WHERE settore LIKE ? ");
            sCurriculumVisti = c.prepareStatement("SELECT data_visita FROM curriculum_visti WHERE p_iva = ? AND id_curr = ? ");
            sDataModificaCurriculum = c.prepareStatement("SELECT id,completo FROM curriculum WHERE id = ?");
            sDataVisitaCurriculum = c.prepareStatement("SELECT data_visita FROM curriculum_visti WHERE p_iva = ? AND id_curr = ? ");
            

            sMadrelingua = c.prepareStatement("SELECT * FROM conoscenza_lingue WHERE id_curr = ? AND compr_ascolto = ? ");
            sCandidatoByMail = c.prepareStatement("SELECT * FROM candidato LEFT JOIN utente_candidato ON codice_fiscale = cod_f WHERE email_utente = ? ");
            sAccrediti = c.prepareStatement("SELECT * FROM persona_giuridica WHERE accreditata = ? ");
            sProfiloAzienda = c.prepareStatement("SELECT * FROM profilo_ricerca WHERE p_iva = ? ");
            sIstruzioneRichiesta = c.prepareStatement("SELECT * FROM istruzione_richiesta WHERE id_prof = ? ");
            aziendaAccreditata = c.prepareStatement("SELECT * FROM persona_giuridica LEFT JOIN utente_azienda ON utente_azienda.p_iva = persona_giuridica.p_iva WHERE email_utente = ? ");

            /**************************** AGGIUNGI ****************************/
            aUtente = c.prepareStatement("INSERT INTO utente(email,password) VALUES(?,MD5(?)) "); //OK
            dUtente = c.prepareStatement("DELETE FROM utente WHERE email ? "); //OK

            aCandidato = c.prepareStatement("INSERT INTO candidato(nome,cognome,codice_fiscale) VALUES(?,?,?) "); //OK
            dCandidato = c.prepareStatement("DELETE FROM candidato WHERE codice_fiscale = ? ");
            aUtenteCandidato = c.prepareStatement("INSERT INTO utente_candidato(email_utente,cod_f) VALUES(?,?) "); //OK

            aAzienda = c.prepareStatement("INSERT INTO persona_giuridica(p_iva, indirizzo, rag_sociale, descrizione) VALUES(?,?,?,?) "); //OK
            aUtenteAzienda = c.prepareStatement("INSERT INTO utente_azienda(email_utente,p_iva) VALUES(?,?) "); //OK
            aDataVisualizzazioneAzienda = c.prepareStatement("INSERT INTO curriculum_visti(p_iva,id_curr,data_visita) VALUES(?,?,?) ");
            sDataVisualizzazioneAzienda = c.prepareStatement("SELECT * FROM curriculum_visti WHERE p_iva = ? AND id_curr = ? ");
            uDataVisualizzazioneAzienda = c.prepareStatement("UPDATE curriculum_visti SET data_visita = ? WHERE p_iva = ? AND id_curr = ?");

            aUtenteGruppo = c.prepareStatement("INSERT INTO privilegi(email_utente,id_gruppo) VALUES(?,?) "); //OK

            aCurriculum = c.prepareStatement("INSERT INTO curriculum(nome,cognome,data_di_nascita,sesso,indirizzo,citta,cap,provincia,recapito_telefonico,email,automunito) VALUES(?,?,?,?,?,?,?,?,?,?,?) "); //OK
            aCurriculumCandidato = c.prepareStatement("INSERT INTO curriculum_candidato(cod_f,id_curr) VALUES(?,?) "); //OK

            aEsperienzaLavorativa = c.prepareStatement("INSERT INTO esperienza_lavorativa(livello,incarico,data_inizio,data_fine,datore,id_curr,id_sett_lav) VALUES(?,?,?,?,?,?,?) "); //OK
            aIstruzione = c.prepareStatement("INSERT INTO istruzione(istituto,nome,data_cons,voto,id_curr,id_tit_studio,settore) VALUES(?,?,?,?,?,?,?) "); //OK
            aPatente = c.prepareStatement("INSERT INTO patenti_candidato(data_conseguimento,id_curr,tip_pat) VALUES(?,?,?) "); //OK 
            aLingua = c.prepareStatement("INSERT INTO conoscenza_lingue(compr_ascolto,compr_lettura,interaz_orale,produz_orale,produz_scritta,id_curr,id_lingue) VALUES(?,?,?,?,?,?,?) "); //OK
            aCapacitaCompetenza = c.prepareStatement("INSERT INTO capacita_competenze(sociali,organizzative,informatiche,tecniche,artistiche,altro) VALUES(?,?,?,?,?,?) "); //OK
            aCompetenzeAggiuntive = c.prepareStatement("INSERT INTO competenze_aggiuntive(id_curr,id_cap_comp) VALUES(?,?) "); //OK

            aPreferenzaLavorativa = c.prepareStatement("INSERT INTO pref_lavorative(id,mob_it,mob_est,disp_sogg_est,prov,regione,settore,tipo_impiego) VALUES(?,?,?,?,?,?,?,?) ");
            aPreferenzaCandidato = c.prepareStatement("INSERT INTO preferenze_candidato(cod_f,id_pref_lav) VALUES (?,?) ");
            uPreferenzaLavorativa = c.prepareStatement("UPDATE pref_lavorative SET mob_it = ?, mob_est = ?, disp_sogg_est = ?, prov = ?, regione = ?, settore = ?, tipo_impiego = ? WHERE id = ? ");
            aPreferenzaRichiesta = c.prepareStatement("INSERT INTO preferenze_richieste(id_prof,id_pref_lav) VALUES (?,?) ");
            aEsperienzaRichiesta = c.prepareStatement("INSERT INTO esperienza_richiesta(id_prof,id_sett_lav,periodo) VALUES (?,?,?) ");
            aLingueRichieste = c.prepareStatement("INSERT INTO lingue_richieste(compr_ascolto,compr_scritto,interaz_orale,produz_orale,scritto,id_prof,id_lingue) VALUES(?,?,?,?,?,?,?) ");
            sLingueRichieste = c.prepareStatement("SELECT * FROM lingue_richieste WHERE id_prof = ? ");
            sNomeLinguaById = c.prepareStatement("SELECT * FROM lingue WHERE id = ? ");

            aDataCurriculum = c.prepareStatement("UPDATE curriculum SET completo = ? WHERE id = ? ");
            aProfiloRicerca = c.prepareStatement("INSERT INTO profilo_ricerca(sesso,eta_min,eta_max,automunito,p_iva) VALUES (?,?,?,?,?) ");
            aIstruzioneRichiesta = c.prepareStatement("INSERT INTO istruzione_richiesta(voto_min,voto_max,id_prof,id_tit_studio,settore) VALUES(?,?,?,?,?)");

            aFoto = c.prepareStatement("UPDATE curriculum SET foto = ? WHERE id = ? ");
            accreditaAzienda = c.prepareStatement("UPDATE persona_giuridica SET accreditata = ? WHERE p_iva = ? ");

            /******************************* GET ******************************/
            gSettoriLavorativi = c.prepareStatement("SELECT * FROM settore_lavorativo "); //OK
            gTitoli = c.prepareStatement("SELECT * FROM titoli_studio "); //OK
            gPatenti = c.prepareStatement("SELECT * FROM patente "); //OK
            gLingue = c.prepareStatement("SELECT * FROM lingue "); //OK
            gNomeLingua = c.prepareStatement("SELECT nome FROM lingue WHERE id = ? "); //OK
            gFoto = c.prepareStatement("SELECT foto FROM curriculum WHERE id = ? ");

            eCurriculum = c.prepareStatement("DELETE FROM curriculum WHERE id = ? "); //OK
            eAzienda = c.prepareStatement("DELETE FROM persona_giuridica WHERE p_iva = ? "); //OK
            cCurriculum = c.prepareStatement("UPDATE curriculum SET completo = ? WHERE id = ? ");
            mCurriculum = c.prepareStatement("UPDATE curriculum SET nome = ?, cognome= ?, data_di_nascita = ?, sesso = ?, indirizzo = ?, citta = ?, cap = ?, provincia = ?, recapito_telefonico = ?, email = ?, automunito = ? WHERE id = ?");
            dPatenti = c.prepareStatement("DELETE FROM patenti_candidato WHERE id_curr = ? ");
            dEsperienze = c.prepareStatement("DELETE FROM esperienza_lavorativa WHERE id_curr = ? ");
            dTitoli = c.prepareStatement("DELETE FROM istruzione WHERE id_curr = ? ");
            dLingue = c.prepareStatement("DELETE FROM conoscenza_lingue WHERE id_curr = ? ");
            dCapacitaCompetenza = c.prepareStatement("DELETE FROM capacita_competenze WHERE id = ? ");
            dProfiloRicerca = c.prepareStatement("DELETE FROM profilo_ricerca WHERE id = ? ");
            dPreferenzaLavorativa = c.prepareStatement("DELETE FROM pref_lavorative WHERE id = ?");

            /**************************** RICERCA *****************************/
            sSesso = c.prepareStatement("SELECT * FROM curriculum WHERE sesso = ? ");

        } catch (ClassNotFoundException e) {
            throw new ServletException("Errore di caricamento driver database", e);
        } catch (SQLException e) {
            throw new ServletException("Errore di connessione al database", e);
        }
    }

    /********************************* SEARCH *********************************/

    /* dato un Utente se questo esiste sul DB ritorna l'Utente dato eltrimenti se non esiste null  */
    public Utente searchUtente(Utente utente) throws ServletException {
        Utente result = null;
        ResultSet r;
        try {
            aziendaAccreditata.setString(1, utente.getEmail());
            r = aziendaAccreditata.executeQuery();

            if (r.next()) {
                if (r.getInt("accreditata") == 0) {
                    return result;
                }
            }

            sUtente.setString(1, utente.getEmail());
            sUtente.setString(2, utente.getPassword());

            r = sUtente.executeQuery();

            if (r.next()) {
                result = new Utente(r.getString("email"), r.getString("password"));
            }
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
        return result;
    }

     public boolean searchCandidatoByCF(String email) throws ServletException {
        ResultSet r;

        try {

            sCandidatoByCF.setString(1,email);
            r = sCandidatoByCF.executeQuery();

            if (r.next()) return true;
            return false;


        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public boolean searchAziendaByPI(String pi) throws ServletException {
        ResultSet r;

        try {

            sAziendaByPI.setString(1,pi);
            r = sAziendaByPI.executeQuery();

            if (r.next()) return true;
            return false;


        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* data una String con la email con la quale si è loggato l'utente ritorna il nome del gruppo */
    public String searchNomeGruppo(String email) throws ServletException {
        String result = null;
        ResultSet r;

        try {
            sNomeGruppo.setString(1, email);

            r = sNomeGruppo.executeQuery();

            if (r.next()) {
                result = r.getString("id_gruppo");
            }
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }

        return result;
    }

    /* data una String con la email con la quale si è loggato l'utente ritorna il nome dell'utente */
    public String searchNomeUtente(String email) throws ServletException {
        String result = null;
        ResultSet r;

        try {
            sNomeUtente.setString(1, email);

            r = sNomeUtente.executeQuery();

            if (r.next()) {
                result = r.getString("nome");
            }
            return SecurityHelpers.stripSlashes(result);
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* data una String con la email con la quale si è loggato l'utente ritorna il nome dell'azienda */
    public String searchNomeAzienda(String email) throws ServletException {
        String result = null;
        ResultSet r;

        try {
            sNomeAzienda.setString(1, email);

            r = sNomeAzienda.executeQuery();

            if (r.next()) {
                result = r.getString("rag_sociale");
            }
            return SecurityHelpers.stripSlashes(result);
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* dato una String con il nome di un gruppo torna una lista di Servizi*/
    public List<Servizio> searchServiziGruppo(String nomeGruppo) throws ServletException {
        List<Servizio> result = new ArrayList();
        ResultSet r;

        try {
            sServizi.setString(1, nomeGruppo);

            r = sServizi.executeQuery();

            while (r.next()) {
                result.add(new Servizio(r.getString("nome"), r.getString("descrizione")));
            }
            return result;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* questo metodo prende un Curriculum e una String email e restituisce l'id del Curriculum passato */
    public int searchIdCurriculum(Curriculum curriculum, String emailUtente) throws ServletException {
        ResultSet r;

        try {

            /* cerco il curriculum tramite l'email */
            sCurriculumUtente.setString(1, emailUtente);

            r = sCurriculumUtente.executeQuery();

            if (r.next()) {
                return r.getInt("id_curr");
            }

            /* se non esiste tramite la mail significa che è un nuovo curriculum e che deve essere ancora finito l'inserimento */
            sCurriculumCandidato.setString(1, SecurityHelpers.addSlashes(curriculum.getNome()));
            sCurriculumCandidato.setString(2, SecurityHelpers.addSlashes(curriculum.getCognome()));
            sCurriculumCandidato.setDate(3, curriculum.getDataDiNascita());
            sCurriculumCandidato.setString(4, SecurityHelpers.addSlashes(curriculum.getIndirizzo()));
            sCurriculumCandidato.setString(5, SecurityHelpers.addSlashes(curriculum.getCitta()));
            sCurriculumCandidato.setString(6, curriculum.getCap());
            sCurriculumCandidato.setString(7, curriculum.getProvincia());
            sCurriculumCandidato.setString(8, curriculum.getTelefono());
            sCurriculumCandidato.setString(9, curriculum.getEmail());

            r = sCurriculumCandidato.executeQuery();

            if (r.next()) {
                return r.getInt("id");
            }
            return 0;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* data una String email del candidato torna una String con il codice fiscale dell'candidato */
    public String searchCodiceFiscale(String email) throws ServletException {
        ResultSet r;

        try {
            sCodFiscale.setString(1, email);
            r = sCodFiscale.executeQuery();

            if (r.next()) {
                return r.getString("cod_f");
            }
            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* dato l'id del curriculum torna il tutto il inserito Curriculum */
    public Curriculum searchCurriculumById(int idCurriculum) throws ServletException {
        ResultSet r;

        Curriculum curriculum = null;

        try {
            sCurriculumById.setInt(1, idCurriculum);
            r = sCurriculumById.executeQuery();

            if (r.next()) {
                curriculum = new Curriculum(SecurityHelpers.stripSlashes(r.getString("nome")),
                        SecurityHelpers.stripSlashes(r.getString("cognome")),
                        r.getDate("data_di_nascita"),
                        r.getString("sesso"),
                        r.getString("cap"),
                        SecurityHelpers.stripSlashes(r.getString("indirizzo")),
                        SecurityHelpers.stripSlashes(r.getString("citta")),
                        r.getString("provincia"),
                        r.getString("recapito_telefonico"),
                        r.getString("email"),
                        r.getString("automunito"));

                curriculum.setFoto(r.getBlob("foto"));

            }

            sPatentiByIdCurriculum.setInt(1, idCurriculum);
            r = sPatentiByIdCurriculum.executeQuery();

            while (r.next()) {
                curriculum.getPatenti().add(new Patente(r.getString("tip_pat"), r.getDate("data_conseguimento")));
            }

            sEsperienzeLavorativeByIdCurriculum.setInt(1, idCurriculum);
            r = sEsperienzeLavorativeByIdCurriculum.executeQuery();

            while (r.next()) {
                curriculum.getEsperienzeLavorative().add(
                        new EsperienzaLavorativa(r.getString("nome"),
                        SecurityHelpers.stripSlashes(r.getString("datore")),
                        SecurityHelpers.stripSlashes(r.getString("incarico")),
                        r.getInt("livello"),
                        r.getDate("data_inizio"),
                        r.getDate("data_fine")));
            }

            sIstruzioneByIdCurriculum.setInt(1, idCurriculum);
            r = sIstruzioneByIdCurriculum.executeQuery();

            while (r.next()) {
                curriculum.getTitoliDiStudio().add(
                        new TitoloDiStudio(r.getString("titolo"),
                        SecurityHelpers.stripSlashes(r.getString("nome")),
                        SecurityHelpers.stripSlashes(r.getString("istituto")),
                        r.getDate("data_cons"),
                        r.getString("voto"),
                        SecurityHelpers.stripSlashes(r.getString("settore"))));
            }

            sLingueByIdCurriculum.setInt(1, idCurriculum);
            r = sLingueByIdCurriculum.executeQuery();

            while (r.next()) {
                curriculum.getLingue().add(
                        new Lingua(getNomeLinguaById(r.getInt("id_lingue")),
                        r.getString("compr_ascolto"),
                        r.getString("compr_lettura"),
                        r.getString("interaz_orale"),
                        r.getString("produz_orale"),
                        r.getString("produz_scritta")));
            }

            sCapacitaCompetenzaById.setInt(1, idCurriculum);
            r = sCapacitaCompetenzaById.executeQuery();

            while (r.next()) {
                curriculum.setCapacitaCompetenze(
                        new CapacitaCompetenza(SecurityHelpers.stripSlashes(r.getString("sociali")),
                        SecurityHelpers.stripSlashes(r.getString("organizzative")),
                        SecurityHelpers.stripSlashes(r.getString("informatiche")),
                        SecurityHelpers.stripSlashes(r.getString("tecniche")),
                        SecurityHelpers.stripSlashes(r.getString("artistiche")),
                        SecurityHelpers.stripSlashes(r.getString("altro"))));
            }

            return curriculum;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* data una String col nome del settore lavorativo torna il suo id */
    public int searchIdSettoreLavorativo(String nomeSettore) throws ServletException {
        ResultSet r;

        try {
            sIdSettoreLavorativo.setString(1, nomeSettore);

            r = sIdSettoreLavorativo.executeQuery();

            if (r.next()) {
                return r.getInt("id");
            }
            return 0;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* data una String col nome del titolo di studio torna il suo id */
    public int searchIdTitoloStudio(String nomeTitolo) throws ServletException {
        ResultSet r;

        try {
            sIdTitoloDiStudio.setString(1, nomeTitolo);

            r = sIdTitoloDiStudio.executeQuery();

            if (r.next()) {
                return r.getInt("id");
            }
            return 0;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* data una String email del candidato, torna l'id del curriculum ad esso associato */
    public int searchIdCurriculumByMail(String email) throws ServletException {
        ResultSet r;
        try {

            sCurriculumUtente.setString(1, email);
            r = sCurriculumUtente.executeQuery();

            if (r.next()) {
                return r.getInt("id_curr");
            }

            return 0;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public String searchPIAziendaByMail(String email) throws ServletException {
        ResultSet r;
        try {

            sAziendaUtente.setString(1, email);
            r = sAziendaUtente.executeQuery();

            if (r.next()) {
                return r.getString("p_iva");
            }

            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public PreferenzaLavorativa searchPreferenzaLavorativa(String email) throws ServletException {
        ResultSet r;
        try {

            sPreferenze.setString(1, searchCodiceFiscale(email));
            r = sPreferenze.executeQuery();

            if (r.next()) {
                return new PreferenzaLavorativa(r.getInt("mob_it"), r.getInt("mob_est"), r.getInt("disp_sogg_est"),
                        r.getString("prov"), r.getString("regione"), r.getString("settore"), r.getString("tipo_impiego"));
            }
            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare le preferenze", ex);
        }
    }

    public PreferenzaLavorativa searchPreferenzaLavorativaAzienda(String pi) throws ServletException {
        ResultSet r;
        try {

            sPreferenze.setString(1, pi);
            r = sPreferenze.executeQuery();

            if (r.next()) {
                return new PreferenzaLavorativa(r.getInt("mob_it"), r.getInt("mob_est"), r.getInt("disp_sogg_est"),
                        r.getString("prov"), r.getString("regione"), r.getString("settore"), r.getString("tipo_impiego"));
            }
                return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare le preferenze", ex);
        }
    }

    /* metodo per controllare se un curriculum è completato; torna true se è completo e false se è incompleto */
    public boolean curriculumCompletoByMail(String email) throws ServletException {
        ResultSet r;
        try {

            sCurriculumUtente.setString(1, email);
            r = sCurriculumUtente.executeQuery();

            if (r.next()) {

                sCurriculumById.setInt(1, r.getInt("id_curr"));
                r = sCurriculumById.executeQuery();

                if (r.next()) {

                    /* confronto con la stringha "1970-01-01" */
                    return !r.getDate("completo").toString().equalsIgnoreCase(new Date(0).toString());
                }
            }

            return false;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public boolean hasProfiloRicerca(String pi) throws ServletException {

        ResultSet r;
        try {
            
            sProfiloAzienda.setString(1, pi);
            r = sProfiloAzienda.executeQuery();

            if (r.next()) {
                return true;
            }
            return false;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }

    }

    public boolean hasPreferences(String email) throws ServletException {
        ResultSet r;
        try {

            String cf = searchCodiceFiscale(email);

            sPreferenze.setString(1, cf);
            r = sPreferenze.executeQuery();

            if (r.next()) {
                return true;
            }
            return false;

        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare le preferenze.", ex);
        }
    }

    public Candidato searchCandidatoByMail(String email) throws ServletException {
        ResultSet r;
        try {
            sCandidatoByMail.setString(1, email);
            r = sCandidatoByMail.executeQuery();
            if (r.next()) {
                return new Candidato(
                        SecurityHelpers.stripSlashes(r.getString("nome")),
                        SecurityHelpers.stripSlashes(r.getString("cognome")),
                        r.getString("codice_fiscale"));
            }
            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare il candidato tramite la mail.", ex);
        }

    }

    public List<Azienda> searchAccrediti() throws ServletException {
        ResultSet r;
        List<Azienda> result = new ArrayList();

        try {
            sAccrediti.setInt(1, 0);
            r = sAccrediti.executeQuery();

            while (r.next()) {
                result.add(new Azienda(r.getString("p_iva"), SecurityHelpers.stripSlashes(r.getString("rag_sociale")), SecurityHelpers.stripSlashes(r.getString("indirizzo")), SecurityHelpers.stripSlashes(r.getString("descrizione"))));
            }

        return result;

        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare le azienda non accreditate.", ex);
        }
    }
    
    public String searchTitoloById(int idTitolo) throws ServletException {
        ResultSet r;

        try {
            sTitoloById.setInt(1, idTitolo);
            r = sTitoloById.executeQuery();

            if (r.next()) {
                return r.getString("titolo");
            }
            return "";
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare le azienda non accreditate.", ex);
        }
    }


    /********************************* AGGIUNGI ********************************/

    /* aggiunge un Utente Candidato */
    public String aggiungiUtenteCandidato(Utente utente, Candidato candidato, String gruppo) throws ServletException {
        ResultSet r;
        try {

            if (searchUtente(utente) != null) return "ATTENZIONE! Email già utilizzata.";
            else if(searchCandidatoByCF(candidato.getCodiceFiscale())) return "ATTENZIONE! Codice Fiscale già utilizzato.";

            aUtente.setString(1, utente.getEmail());
            aUtente.setString(2, utente.getPassword());

            aCandidato.setString(1, SecurityHelpers.addSlashes(candidato.getNome()));
            aCandidato.setString(2, SecurityHelpers.addSlashes(candidato.getCognome()));
            aCandidato.setString(3, candidato.getCodiceFiscale());

            aUtenteCandidato.setString(1, utente.getEmail());
            aUtenteCandidato.setString(2, candidato.getCodiceFiscale());

            aUtenteGruppo.setString(1, utente.getEmail());
            aUtenteGruppo.setString(2, gruppo);

            if ((aUtente.executeUpdate() + aCandidato.executeUpdate() + aUtenteCandidato.executeUpdate() + aUtenteGruppo.executeUpdate()) == 4) return "OK";
            else {
                dUtente.setString(1,utente.getEmail());
                if (dUtente.executeUpdate() == 1) {
                    sCodFiscale.setString(1, utente.getEmail());
                    r = sCodFiscale.executeQuery();
                    if (r.next()) {
                        dCandidato.setString(1,r.getString("cod_f"));
                        if (dCandidato.executeUpdate() == 1) return "ATTENZIONE! Si è verificato un errore durante la registrazione.";
                    }
                }
                return "ATTENZIONE! Si è verificato un errore durante la registrazione.";
            }
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* aggiunge un Utente Azienda */
    public String aggiungiUtenteAzienda(Utente utente, Azienda azienda, String gruppo) throws ServletException {
        try {

            if (searchUtente(utente) != null) return "ATTENZIONE! Email già utilizzata.";
            else if(searchAziendaByPI(azienda.getPartitaIva())) return "ATTENZIONE! Partita Iva già utilizzata.";

            aUtente.setString(1, utente.getEmail());
            aUtente.setString(2, utente.getPassword());

            aAzienda.setString(1, azienda.getPartitaIva());
            aAzienda.setString(2, SecurityHelpers.addSlashes(azienda.getIndirizzo()));
            aAzienda.setString(3, SecurityHelpers.addSlashes(azienda.getRagioneSociale()));
            aAzienda.setString(4, SecurityHelpers.addSlashes(azienda.getDescrizione()));

            aUtenteAzienda.setString(1, utente.getEmail());
            aUtenteAzienda.setString(2, azienda.getPartitaIva());

            aUtenteGruppo.setString(1, utente.getEmail());
            aUtenteGruppo.setString(2, gruppo);

            if ((aUtente.executeUpdate() + aAzienda.executeUpdate() + aUtenteAzienda.executeUpdate() + aUtenteGruppo.executeUpdate()) == 4) return "OK";
            else {
                dUtente.setString(1,utente.getEmail());
                if (dUtente.executeUpdate() == 1) {
                    eAzienda.setString(1,searchPIAziendaByMail(utente.getEmail()));
                    if (eAzienda.executeUpdate() == 1) return "ATTENZIONE! Si è verificato un errore durante la registrazione.";
                }
            }
            return "ATTENZIONE! Si è verificato un errore durante la registrazione.";
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public boolean aggiungiPreferenzaLavorativa(PreferenzaLavorativa preferenza, String cf) throws ServletException {
        try {

            aPreferenzaLavorativa.setString(1, cf);
            aPreferenzaLavorativa.setInt(2, preferenza.getMobilitaItalia());
            aPreferenzaLavorativa.setInt(3, preferenza.getMobilitaEstero());
            aPreferenzaLavorativa.setInt(4, preferenza.getSoggiornoEstero());
            aPreferenzaLavorativa.setString(5, preferenza.getProvincia());
            aPreferenzaLavorativa.setString(6, preferenza.getRegione());
            aPreferenzaLavorativa.setString(7, preferenza.getSettore());
            aPreferenzaLavorativa.setString(8, preferenza.getTipoImpiego());


            if (aPreferenzaLavorativa.executeUpdate() == 1) {

                aPreferenzaCandidato.setString(1,cf);
                aPreferenzaCandidato.setString(2,cf);

                return aPreferenzaCandidato.executeUpdate() == 1;
            }
            return false;

        } catch (SQLException ex) {
            throw new ServletException("Errore nella aggiungere la preferenza", ex);
        }
    }

    public boolean modificaPreferenzaLavorativa(PreferenzaLavorativa preferenza, String id) throws ServletException {
        try {

            uPreferenzaLavorativa.setInt(1, preferenza.getMobilitaItalia() == 1 ? 1 : 0);
            uPreferenzaLavorativa.setInt(2, preferenza.getMobilitaEstero() == 1 ? 1 : 0);
            uPreferenzaLavorativa.setInt(3, preferenza.getSoggiornoEstero() == 1 ? 1 : 0);
            uPreferenzaLavorativa.setString(4, preferenza.getProvincia());
            uPreferenzaLavorativa.setString(5, preferenza.getRegione());
            uPreferenzaLavorativa.setString(6, preferenza.getSettore());
            uPreferenzaLavorativa.setString(7, preferenza.getTipoImpiego());
            uPreferenzaLavorativa.setString(8, id);

            return uPreferenzaLavorativa.executeUpdate() == 1;

        } catch (SQLException ex) {
            throw new ServletException("Errore nella modifica della preferenza", ex);
        }
    }

    public int searchProfilo(String pi) throws ServletException {
        ResultSet r;
        try {
            sProfilo.setString(1, pi);
            r = sProfilo.executeQuery();
            if (r.next()) {
                return r.getInt("id");
            }
            return 0;
        } catch (SQLException ex) {
            throw new ServletException("Errore nella ricerca del profilo di ricerca.", ex);
        }

    }

    public String searchSettoreLavorativoById(int id) throws ServletException {
        ResultSet r;
        try {
            sSettoreLavorativoById.setInt(1, id);
            r = sSettoreLavorativoById.executeQuery();
            if (r.next()) {
                return r.getString("nome");
            }
            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore nella ricerca del profilo di ricerca.", ex);
        }

    }

    public String searchNomeLinguaById(int id) throws ServletException {
        ResultSet r;
        try {
            sNomeLinguaById.setInt(1, id);
            r = sNomeLinguaById.executeQuery();
            if (r.next()) {
                return r.getString("nome");
            }
            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore nella ricerca del profilo di ricerca.", ex);
        }

    }

    public boolean aggiungiProfiloRicerca(ProfiloRicerca profilo, String pi) throws ServletException {
        int idProfilo = 0;
        try {

            aProfiloRicerca.setString(1, profilo.getSesso());
            aProfiloRicerca.setInt(2, profilo.getEtaMin());
            aProfiloRicerca.setInt(3, profilo.getEtaMax());
            aProfiloRicerca.setString(4, profilo.getAutomunito());
            aProfiloRicerca.setString(5, pi);

            if (aProfiloRicerca.executeUpdate() != 1) return false; /* profilo inserito*/

            idProfilo = searchProfilo(pi);
            aIstruzioneRichiesta.setInt(1, profilo.getIstruzioneRichiesta().getVotoMin());
            aIstruzioneRichiesta.setInt(2, profilo.getIstruzioneRichiesta().getVotoMax());
            aIstruzioneRichiesta.setInt(3, idProfilo);
            aIstruzioneRichiesta.setInt(4, searchIdTitoloStudio(profilo.getIstruzioneRichiesta().getTitoloStudio()));
            aIstruzioneRichiesta.setString(5, SecurityHelpers.addSlashes(profilo.getIstruzioneRichiesta().getSettore()));

            if (aIstruzioneRichiesta.executeUpdate() != 1) return false; /* istruzione inserita */

            aPreferenzaLavorativa.setString(1, pi);
            aPreferenzaLavorativa.setInt(2, profilo.getPreferenzaLavorativa().getMobilitaItalia());
            aPreferenzaLavorativa.setInt(3, profilo.getPreferenzaLavorativa().getMobilitaEstero());
            aPreferenzaLavorativa.setInt(4, profilo.getPreferenzaLavorativa().getSoggiornoEstero());
            aPreferenzaLavorativa.setString(5, profilo.getPreferenzaLavorativa().getProvincia());
            aPreferenzaLavorativa.setString(6, profilo.getPreferenzaLavorativa().getRegione());
            aPreferenzaLavorativa.setString(7, profilo.getPreferenzaLavorativa().getSettore());
            aPreferenzaLavorativa.setString(8, profilo.getPreferenzaLavorativa().getTipoImpiego());

            if (aPreferenzaLavorativa.executeUpdate() != 1) return false; /* preferenza lavorativa inserita */

            aPreferenzaRichiesta.setString(1,pi);
            aPreferenzaRichiesta.setString(2,pi);

            if (aPreferenzaRichiesta.executeUpdate() != 1) return false; /* preferenza richiesta inserita */

            aEsperienzaRichiesta.setInt(1,idProfilo);
            aEsperienzaRichiesta.setInt(2, searchIdSettoreLavorativo(profilo.getEsperienzaRichiesta().getSettoreLavorativo()));
            aEsperienzaRichiesta.setInt(3,profilo.getEsperienzaRichiesta().getPeriodo());
            
            if (aEsperienzaRichiesta.executeUpdate() != 1) return false; /* esperienza richiesta inserita */

            Iterator<String> it = profilo.getLingueRichieste().getLingue().iterator();
            while(it.hasNext()) {

                aLingueRichieste.setString(1, new String());
                aLingueRichieste.setString(2, new String());
                aLingueRichieste.setString(3, new String());
                aLingueRichieste.setString(4, new String());
                aLingueRichieste.setString(5, new String());
                aLingueRichieste.setInt(6, idProfilo);
                aLingueRichieste.setInt(7, searchIdLingua(it.next()));

                if (aLingueRichieste.executeUpdate() != 1) return false; /* lingue richieste inserita */
                  
            }
            return true;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database.", ex);
        }
    }

    public boolean modificaProfiloRicerca(ProfiloRicerca profilo, String pi) throws ServletException {
        int idProfilo = 0;

        try {
            

            idProfilo = searchProfilo(pi);

            dProfiloRicerca.setInt(1, idProfilo);
            dProfiloRicerca.executeUpdate();

            dPreferenzaLavorativa.setString(1, pi);
            dPreferenzaLavorativa.executeUpdate();

            return aggiungiProfiloRicerca(profilo,pi);

        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database.", ex);
        }

        
    }

    public ProfiloRicerca searchProfiloRicercaByEmail(String email) throws ServletException {
        ResultSet r;
        ProfiloRicerca profilo = new ProfiloRicerca();

        String pi = searchPIAziendaByMail(email);
        int idProfilo = 0;

        try {
            sProfiloRicerca.setString(1,pi);
            r = sProfiloRicerca.executeQuery();

            if (r.next()) {
                idProfilo = r.getInt("id");
                profilo.setEtaMin(r.getInt("eta_min"));
                profilo.setEtaMax(r.getInt("eta_max"));
                profilo.setSesso(r.getString("sesso"));
                profilo.setAutomunito(r.getString("automunito"));
            }

            sIstruzioneRichiesta.setInt(1,idProfilo);
            r = sIstruzioneRichiesta.executeQuery();

            if (r.next()) {
                profilo.setIstruzioneRichiesta(
                        new IstruzioneRichiesta(r.getInt("voto_min"),r.getInt("voto_max"),
                        r.getString("settore"),searchTitoloById(r.getInt("id_tit_studio"))));
            }

            profilo.setPreferenzaLavorativa(searchPreferenzaLavorativaAzienda(pi));

            sPreferenzaRichiesta.setInt(1, idProfilo);
            r = sPreferenzaRichiesta.executeQuery();

            if (r.next()) {
                profilo.setEsperienzaRichiesta(
                        new EsperienzaRichiesta(r.getInt("periodo"),searchSettoreLavorativoById(r.getInt("id_sett_lav"))));
            }

            sLingueRichieste.setInt(1,idProfilo);
            r = sLingueRichieste.executeQuery();
            LingueRichieste lingue = new LingueRichieste();

            while (r.next()) {
                lingue.getLingue().add(searchNomeLinguaById(r.getInt("id_lingue")));
            }

            profilo.setLingueRichieste(lingue);
            return profilo;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database.", ex);
        }
    }

    /* ritorna l'ID del curriculum appenna inserito */
    public int aggiungiCurriculum(Curriculum curriculum, String emailSession) throws ServletException {

        int id = searchIdCurriculum(curriculum, emailSession);

        try {

            if (id != 0) { /* il curriculum associato a quest'utente già esiste */
                return id;
            }

            /* inserisci il nuovo curriculum */

            aCurriculum.setString(1, SecurityHelpers.addSlashes(curriculum.getNome()));
            aCurriculum.setString(2, SecurityHelpers.addSlashes(curriculum.getCognome()));
            aCurriculum.setDate(3, curriculum.getDataDiNascita());
            aCurriculum.setString(4, curriculum.getSesso());
            aCurriculum.setString(5, SecurityHelpers.addSlashes(curriculum.getIndirizzo()));
            aCurriculum.setString(6, SecurityHelpers.addSlashes(curriculum.getCitta()));
            aCurriculum.setString(7, curriculum.getCap());
            aCurriculum.setString(8, curriculum.getProvincia());
            aCurriculum.setString(9, curriculum.getTelefono());
            aCurriculum.setString(10, curriculum.getEmail());
            aCurriculum.setString(11, curriculum.getAutomunito());

            if (aCurriculum.executeUpdate() == 1) {

                /* se viene inserito il curriculum deve essere inserito anche in curriculum_candidato */

                aCurriculumCandidato.setString(1, searchCodiceFiscale(emailSession));
                aCurriculumCandidato.setInt(2, searchIdCurriculum(curriculum, emailSession));

                if (aCurriculumCandidato.executeUpdate() == 1) {
                    return searchIdCurriculum(curriculum, emailSession);
                }
            }
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database.", ex);
        }
        return searchIdCurriculum(curriculum, emailSession);
    }

    public boolean modificaCurriculum(Curriculum curriculum, String emailSession) throws ServletException {
        ResultSet r;

        int id = 0;

        try {

            sCurriculumUtente.setString(1, emailSession);
            r = sCurriculumUtente.executeQuery();
            if (r.next()) {
                id = r.getInt("id_curr");

                mCurriculum.setString(1, SecurityHelpers.addSlashes(curriculum.getNome()));
                mCurriculum.setString(2, SecurityHelpers.addSlashes(curriculum.getCognome()));
                mCurriculum.setDate(3, curriculum.getDataDiNascita());
                mCurriculum.setString(4, curriculum.getSesso());
                mCurriculum.setString(5, SecurityHelpers.addSlashes(curriculum.getIndirizzo()));
                mCurriculum.setString(6, SecurityHelpers.addSlashes(curriculum.getCitta()));
                mCurriculum.setString(7, curriculum.getCap());
                mCurriculum.setString(8, curriculum.getProvincia());
                mCurriculum.setString(9, curriculum.getTelefono());
                mCurriculum.setString(10, curriculum.getEmail());
                mCurriculum.setString(11, curriculum.getAutomunito());

                mCurriculum.setInt(12, id);

                return mCurriculum.executeUpdate() == 1;
            }
            return false;

        } catch (SQLException ex) {
            throw new ServletException("Errore nella modifica del curriculum.", ex);
        }
    }

    /* aggiunge un esperienza lavorativa ad un curriculum solo se questa non esiste già */
    public boolean aggiungiEsperienzaLavorativa(EsperienzaLavorativa esperienzaLavorativa, String idCurriculum) throws ServletException {
        ResultSet r;

        try {

            /* aggiunge l'esperienza solo se non esiste */
            sEsperienzaLavorativa.setDate(1, esperienzaLavorativa.getDataInizio());
            sEsperienzaLavorativa.setInt(2, Integer.parseInt(idCurriculum));
            sEsperienzaLavorativa.setInt(3, searchIdSettoreLavorativo(esperienzaLavorativa.getSettoreLavorativo()));

            r = sEsperienzaLavorativa.executeQuery();

            if (!r.next()) {

                aEsperienzaLavorativa.setInt(1, esperienzaLavorativa.getLivello());
                aEsperienzaLavorativa.setString(2, SecurityHelpers.addSlashes(esperienzaLavorativa.getIncarico()));
                aEsperienzaLavorativa.setDate(3, esperienzaLavorativa.getDataInizio());
                aEsperienzaLavorativa.setDate(4, esperienzaLavorativa.getDataFine());
                aEsperienzaLavorativa.setString(5, SecurityHelpers.addSlashes(esperienzaLavorativa.getDatoreDiLavoro()));
                aEsperienzaLavorativa.setInt(6, Integer.parseInt(idCurriculum));
                aEsperienzaLavorativa.setInt(7, searchIdSettoreLavorativo(esperienzaLavorativa.getSettoreLavorativo()));

                return (aEsperienzaLavorativa.executeUpdate() == 1);
            }

            return false;

        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public boolean modificaEsperienze(TreeSet<EsperienzaLavorativa> esperienze, String idCurriculum) throws ServletException {
        try {
            dEsperienze.setInt(1, Integer.parseInt(idCurriculum));

            if (dEsperienze.executeUpdate() >= 0) {

                Iterator<EsperienzaLavorativa> it = esperienze.iterator();

                while (it.hasNext()) {

                    if (!aggiungiEsperienzaLavorativa(it.next(), idCurriculum)) {
                        return false;
                    }
                }

            }
            return true;
        } catch (SQLException ex) {
            throw new ServletException("Errore nella modificadelle patenti.", ex);
        }

    }
    /* aggiunge un istruzione ad un curriculum solo se questa non esiste già */

    public boolean aggiungiIstruzione(TitoloDiStudio titolo, String idCurriculum) throws ServletException {
        ResultSet r;

        try {

            /* aggiunge l'esperienza solo se non esiste */
            sIstruzione.setDate(1, titolo.getDataConseguimento());
            sIstruzione.setInt(2, Integer.parseInt(idCurriculum));
            sIstruzione.setInt(3, searchIdTitoloStudio(titolo.getTipoTitolo()));

            r = sIstruzione.executeQuery();

            if (!r.next()) {

                aIstruzione.setString(1, SecurityHelpers.addSlashes(titolo.getIstitutoErogante()));
                aIstruzione.setString(2, SecurityHelpers.addSlashes(titolo.getNomeTitolo()));
                aIstruzione.setDate(3, titolo.getDataConseguimento());
                aIstruzione.setString(4, titolo.getVoto());
                aIstruzione.setInt(5, Integer.parseInt(idCurriculum));
                aIstruzione.setInt(6, searchIdTitoloStudio(titolo.getTipoTitolo()));
                aIstruzione.setString(7, SecurityHelpers.addSlashes(titolo.getSettore()));

                return (aIstruzione.executeUpdate() == 1);
            }

            return false;

        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public boolean modificaTitoli(TreeSet<TitoloDiStudio> titoli, String idCurriculum) throws ServletException {
        try {
            dTitoli.setInt(1, Integer.parseInt(idCurriculum));

            if (dTitoli.executeUpdate() >= 0) {

                Iterator<TitoloDiStudio> it = titoli.iterator();

                while (it.hasNext()) {

                    if (!aggiungiIstruzione(it.next(), idCurriculum)) {
                        return false;
                    }
                }

            }
            return true;
        } catch (SQLException ex) {
            throw new ServletException("Errore nella modifica dei titoli di studio.", ex);
        }
    }

    /* aggiunge una patente ad un curriculum solo se questa non esiste già */
    public boolean aggiungiPatente(Patente newPatente, String idCurriculum) throws ServletException {
        ResultSet r;

        try {

            /* aggiunge la patente solo se non esiste*/
            sPatente.setDate(1, newPatente.getDataRilascioPatente());
            sPatente.setInt(2, Integer.parseInt(idCurriculum));
            sPatente.setString(3, newPatente.getTipologia());

            r = sPatente.executeQuery();

            if (!r.next()) {

                aPatente.setDate(1, newPatente.getDataRilascioPatente());
                aPatente.setInt(2, Integer.parseInt(idCurriculum));
                aPatente.setString(3, newPatente.getTipologia());

                return (aPatente.executeUpdate() == 1);
            }

            return false;

        } catch (SQLException ex) {
            throw new ServletException("Errore nell'inserimento della patente.", ex);
        }
    }

    public boolean modificaPatenti(List<Patente> patenti, String idCurriculum) throws ServletException {
        try {

            dPatenti.setInt(1, Integer.parseInt(idCurriculum));

            if (dPatenti.executeUpdate() >= 0) {

                Iterator<Patente> it = patenti.iterator();

                while (it.hasNext()) {

                    if (!aggiungiPatente(it.next(), idCurriculum)) {
                        return false;
                    }
                }

            }
            return true;

        } catch (SQLException ex) {
            throw new ServletException("Errore nella modifica delle patenti.", ex);
        }
    }

    /* aggiunge una lingua al curriculum solo se questa non esiste già */
    public boolean aggiungiLingua(Lingua newLingua, String idCurriculum) throws ServletException {
        ResultSet r;

        try {

            int idLingua = 0;

            /* cerco l'id della lingua da inserire */
            sIdLingua.setString(1, newLingua.getNomeLingua());
            r = sIdLingua.executeQuery();

            if (r.next()) {
                idLingua = r.getInt("id");
            }

            if (newLingua.getComprensioneAscolto().equalsIgnoreCase("ML")) { /* è la madrelingua */

                sMadrelingua.setInt(1, Integer.parseInt(idCurriculum));
                sMadrelingua.setString(2, newLingua.getComprensioneAscolto());

                r = sMadrelingua.executeQuery();

                if (r.next()) {

                    /* esiste già una madrelingua per il momento non viene inserita la seconda arrivata */

                    return false;
                }

            }
            
            /* aggiunge l'esperienza solo se non esiste */
            sLingua.setInt(1, Integer.parseInt(idCurriculum));
            sLingua.setInt(2, idLingua);

            r = sLingua.executeQuery();

            if (!r.next()) {

                aLingua.setString(1, newLingua.getComprensioneAscolto());
                aLingua.setString(2, newLingua.getComprensioneLettura());
                aLingua.setString(3, newLingua.getParlatoIterazioneOrale());
                aLingua.setString(4, newLingua.getParlatoProduzioneOrale());
                aLingua.setString(5, newLingua.getScrittoProduzioneScritto());
                aLingua.setInt(6, Integer.parseInt(idCurriculum));
                aLingua.setInt(7, idLingua);

                return (aLingua.executeUpdate() == 1);
            }

            return false;

        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public boolean modificaLingue(List<Lingua> lingue, String idCurriculum) throws ServletException {
        try {

            dLingue.setInt(1, Integer.parseInt(idCurriculum));

            if (dLingue.executeUpdate() >= 0) {

                Iterator<Lingua> it = lingue.iterator();

                while (it.hasNext()) {

                    if (!aggiungiLingua(it.next(), idCurriculum)) {
                        return false;
                    }
                }

            }
            return true;

        } catch (SQLException ex) {
            throw new ServletException("Errore nella modifica delle lingue.", ex);
        }
    }

    /* aggiunge una capacita e competenza relativa al curriculum */
    public boolean aggiungiCapacitaCompetenza(CapacitaCompetenza capacitaCompetenza, String idCurriculum) throws ServletException {
        ResultSet r;
        try {

            aCapacitaCompetenza.setString(1, SecurityHelpers.addSlashes(capacitaCompetenza.getSociali()));
            aCapacitaCompetenza.setString(2, SecurityHelpers.addSlashes(capacitaCompetenza.getOrganizzative()));
            aCapacitaCompetenza.setString(3, SecurityHelpers.addSlashes(capacitaCompetenza.getInformatiche()));
            aCapacitaCompetenza.setString(4, SecurityHelpers.addSlashes(capacitaCompetenza.getTecniche()));
            aCapacitaCompetenza.setString(5, SecurityHelpers.addSlashes(capacitaCompetenza.getArtistiche()));
            aCapacitaCompetenza.setString(6, SecurityHelpers.addSlashes(capacitaCompetenza.getAltro()));
            if (aCapacitaCompetenza.executeUpdate() == 1) {
                sIdCapacitaCompetenza.setString(1, SecurityHelpers.addSlashes(capacitaCompetenza.getSociali()));
                sIdCapacitaCompetenza.setString(2, SecurityHelpers.addSlashes(capacitaCompetenza.getOrganizzative()));
                sIdCapacitaCompetenza.setString(3, SecurityHelpers.addSlashes(capacitaCompetenza.getInformatiche()));
                sIdCapacitaCompetenza.setString(4, SecurityHelpers.addSlashes(capacitaCompetenza.getTecniche()));
                sIdCapacitaCompetenza.setString(5, SecurityHelpers.addSlashes(capacitaCompetenza.getArtistiche()));
                sIdCapacitaCompetenza.setString(6, SecurityHelpers.addSlashes(capacitaCompetenza.getAltro()));
                r = sIdCapacitaCompetenza.executeQuery();
                if (r.next()) {
                    aCompetenzeAggiuntive.setInt(1, Integer.parseInt(idCurriculum));
                    aCompetenzeAggiuntive.setInt(2, r.getInt("id"));
                    return aCompetenzeAggiuntive.executeUpdate() == 1;
                }
            }
            return false;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    public boolean modificaCapacitaCompetenza(CapacitaCompetenza capacitaCompetenza, String idCurriculum) throws ServletException {
        ResultSet r;
        try {

            sCapacitaCompetenzaById.setInt(1, Integer.parseInt(idCurriculum));
            r = sCapacitaCompetenzaById.executeQuery();

            if (r.next()) {
                dCapacitaCompetenza.setInt(1, r.getInt("id_cap_comp"));

                if (dCapacitaCompetenza.executeUpdate() == 1) {

                    if (!aggiungiCapacitaCompetenza(capacitaCompetenza, idCurriculum)) {
                        return false;
                    }

                }
            } else {

                return aggiungiCapacitaCompetenza(capacitaCompetenza, idCurriculum);
            }
            return true;

        } catch (SQLException ex) {
            throw new ServletException("Errore nella modifica delle capacità e competenze.", ex);
        }
    }

    public boolean cancellaCapacitaCompetenze(String idCurriculum) throws ServletException {
        ResultSet r;
        try {

            sCapacitaCompetenzaById.setInt(1, Integer.parseInt(idCurriculum));
            r = sCapacitaCompetenzaById.executeQuery();

            if (r.next()) {
                dCapacitaCompetenza.setInt(1, r.getInt("id_cap_comp"));

                return dCapacitaCompetenza.executeUpdate() == 1;
            }
            return true;

        } catch (SQLException ex) {
            throw new ServletException("Errore nella modifica delle capacità e competenze.", ex);
        }
    }

    /* aggiunge la foto al curriculum */
    public boolean aggiungiFoto(InputStream foto, String idCurriculum) throws ServletException {
        try {
            aFoto.setBlob(1, foto);
            aFoto.setInt(2, Integer.parseInt(idCurriculum));

            return aFoto.executeUpdate() == 1;

        } catch (SQLException ex) {
            throw new ServletException("Errore nell'inserimento della foto", ex);
        }
    }

    /*********************************** GET **********************************/

    /* torna un lista con i nomi dei settori lavorativi inseriti */
    public List getSettoriLavorativi() throws ServletException {
        ResultSet r;
        List result = new ArrayList();

        try {
            r = gSettoriLavorativi.executeQuery();

            while (r.next()) {
                result.add(r.getString("nome"));
            }

            return result;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* torna una lista con i nomi dei titilo di studio inseriti */
    public List getTitoli() throws ServletException {
        ResultSet r;
        List result = new ArrayList();

        try {
            r = gTitoli.executeQuery();

            while (r.next()) {
                result.add(r.getString("titolo"));
            }

            return result;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* torna una lista con i nomi delle patenti inserite*/
    public List getPatenti() throws ServletException {
        ResultSet r;
        List result = new ArrayList();

        try {
            r = gPatenti.executeQuery();

            while (r.next()) {
                result.add(r.getString("tipologia"));
            }
            return result;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /* torna lista con i nomi delle lingue inserite */
    public List getLingue() throws ServletException {
        ResultSet r;
        List result = new ArrayList();

        try {
            r = gLingue.executeQuery();

            while (r.next()) {
                result.add(r.getString("nome"));
            }
            return result;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database.", ex);
        }
    }


    private int searchIdLingua(String nome) throws ServletException {
        ResultSet r;
        try {
            sIdLingua.setString(1, nome);
            r = sIdLingua.executeQuery();
            if (r.next()) {
                return r.getInt("id");
            }
            return 0;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database.", ex);
        }


    }

    public Blob getFoto(int idCurr) throws ServletException {
        ResultSet r;
        try {

            gFoto.setInt(1, idCurr);
            r = gFoto.executeQuery();
            if (r.next()) {
                return r.getBlob("foto");
            }
            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel reperire la foto.", ex);
        }
    }

    /* torna il nome della lingua dato il suo id */
    public String getNomeLinguaById(int idLingua) throws ServletException {
        ResultSet r;
        try {
            gNomeLingua.setInt(1, idLingua);

            r = gNomeLingua.executeQuery();

            if (r.next()) {
                return r.getString("nome");
            }
            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /****************************** ELIMINAZIONI ******************************/

    /* data l'email dell'utente elimina in suo curriculum */
    public boolean eliminaCurriculum(String email) throws ServletException {
        try {
            eCurriculum.setInt(1, searchIdCurriculumByMail(email));
            return eCurriculum.executeUpdate() == 1;
        } catch (SQLException ex) {
            throw new ServletException("Errore di connessione al database", ex);
        }
    }

    /*********************************** ALTRO **********************************/

    /* completa l'inserimento del curriculum */
    public boolean completaCurriculum(String idCurriculum) throws ServletException {
        try {

            cCurriculum.setDate(1, new Date(Calendar.getInstance().getTimeInMillis()));
            cCurriculum.setInt(2, Integer.parseInt(idCurriculum));

            return cCurriculum.executeUpdate() == 1;

        } catch (SQLException ex) {
            throw new ServletException("Errore nel completamento del Curriculum.", ex);
        }
    }

    public boolean accreditaAzienda(String pi) throws ServletException {
        try {

            accreditaAzienda.setInt(1, 1);
            accreditaAzienda.setString(2, pi);

            return accreditaAzienda.executeUpdate() == 1;

        } catch (SQLException ex) {
            throw new ServletException("Errore nel accreditare l'azienda.", ex);
        }
    }

    public boolean eliminaAzienda(String pi) throws ServletException {
        try {

            eAzienda.setString(1, pi);

            return eAzienda.executeUpdate() == 1;

        } catch (SQLException ex) {
            throw new ServletException("Errore nell'eliminare l'azienda.", ex);
        }
    }

    public boolean aggiornaDataVisualizzazioneAzienda(int idCurr, String pi) throws ServletException {
        ResultSet r;
        try {

            sDataVisualizzazioneAzienda.setString(1, pi);
            sDataVisualizzazioneAzienda.setInt(2, idCurr);
            r = sDataVisualizzazioneAzienda.executeQuery();

            if (r.next()) {
                uDataVisualizzazioneAzienda.setDate(1, new Date(Calendar.getInstance().getTimeInMillis()));
                uDataVisualizzazioneAzienda.setString(2, pi);
                uDataVisualizzazioneAzienda.setInt(3, idCurr);
                return uDataVisualizzazioneAzienda.executeUpdate()==1;
            } else {
                aDataVisualizzazioneAzienda.setString(1, pi);
                aDataVisualizzazioneAzienda.setInt(2, idCurr);
                aDataVisualizzazioneAzienda.setDate(3, new Date(Calendar.getInstance().getTimeInMillis()));
                return aDataVisualizzazioneAzienda.executeUpdate() == 1;
            }

        } catch (SQLException ex) {
            throw new ServletException("Errore nell'aggiornare la data di visualizzazione.", ex);
        }
    }

    public Date searchDataModificaCurriculum(int idCurr) throws ServletException {
        ResultSet r;

        try {
            sDataModificaCurriculum.setInt(1,idCurr);

            r = sDataModificaCurriculum.executeQuery();

            if (r.next()) {
                return r.getDate("completo");
            }
            return null;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i nuovi curriculum.", ex);
        }
    }

    public Set<Curriculum> searchNuoviCurriculum(Set<Curriculum> risultati, String email) throws ServletException {
        ResultSet r,t;
        Set<Curriculum> result = new TreeSet();

        String pi = searchPIAziendaByMail(email);

        try {

            Iterator<Curriculum> it = risultati.iterator();
            while (it.hasNext()) {

                Curriculum curr = it.next();
                int idCurr  = curr.getId();

                Date dataVisita;
                Date dataCurr = searchDataModificaCurriculum(idCurr);

                    sDataVisitaCurriculum.setString(1,pi);
                    sDataVisitaCurriculum.setInt(2,curr.getId());

                    t = sDataVisitaCurriculum.executeQuery();

                    if (t.next()) {
                        dataVisita = t.getDate("data_visita");

                        if (dataVisita.getTime()< dataCurr.getTime()) result.add(new Curriculum(curr.getId(),searchCurriculumById(curr.getId())));

                    } else result.add(new Curriculum(curr.getId(),searchCurriculumById(curr.getId())));

            }

            return result;

        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i nuovi curriculum.", ex);
        }
    }

    /********************************* Ricerca ********************************/
    public Set<Curriculum> searchCurriculumBySesso(String sesso) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;
        try {
            sSesso.setString(1, sesso);
            r = sSesso.executeQuery();

            while (r.next()) {
                idCurr = r.getInt("id");
                risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumByAutomunito(String automunito) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;
        try {
            sAutomuniti.setString(1, automunito);
            r = sAutomuniti.executeQuery();

            while (r.next()) {
                idCurr = r.getInt("id");
                risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumEta(String etaMin, String etaMax) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;
        long oggi = Calendar.getInstance().getTimeInMillis();
        long millisecondiInUnAnno = 31536000000L;

        try {
            r = sDateDiNascita.executeQuery();

            while (r.next()) {  
                long anni = (oggi - r.getDate("data_di_nascita").getTime()) / millisecondiInUnAnno;
                idCurr = r.getInt("id");
                if (anni >= Integer.parseInt(etaMin) && anni <= Integer.parseInt(etaMax)) {
                    risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
                }
            }
            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumByPeriodo(String Preriodo) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;
        long millisecondiInUnMese = 2678400000L;

        try {
            r = sCurriculumByPeriodo.executeQuery();

            while (r.next()) {

                long mesi = (r.getDate("data_fine").getTime() - r.getDate("data_inizio").getTime()) / millisecondiInUnMese;
                
                if (mesi >= Integer.parseInt(Preriodo)) {
                    idCurr = r.getInt("id_curr");
                    risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
                }
            }
            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumBySettoriLavorativi(String settore) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;
        
        try {
            sCurriculumBySettoreLavorativo.setString(1,settore);
            r = sCurriculumBySettoreLavorativo.executeQuery();

            while (r.next()) {
                idCurr = r.getInt("id_curr");
                risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumByTitoloStudio(String titolo) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;

        try {
            sCurriculumByTitoloStudio.setString(1,titolo);
            r = sCurriculumByTitoloStudio.executeQuery();

            while (r.next()) {
                idCurr = r.getInt("id_curr");
                risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumByTipoImpiego(String tipoImpiego) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;

        try {
            sCurriculumByTipoImpiego.setString(1,tipoImpiego);
            r = sCurriculumByTipoImpiego.executeQuery();

            while (r.next()) {
                idCurr = r.getInt("id_curr");
                risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumByProvincia(String provincia) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;

        try {
            sCurriculumByProvincia.setString(1,provincia);
            r = sCurriculumByProvincia.executeQuery();

            while (r.next()) {
                idCurr = r.getInt("id_curr");
                risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumByRegione(String regione) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;

        try {
            sCurriculumByRegione.setString(1,regione);
            r = sCurriculumByRegione.executeQuery();

            while (r.next()) {
                idCurr = r.getInt("id_curr");
                risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumByLingue(LingueRichieste lingue) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;

        try {
            Iterator<String> it = lingue.getLingue().iterator();

            while(it.hasNext()) {

                sCurriculumByLingue.setString(1,it.next());
                r = sCurriculumByLingue.executeQuery();

                while (r.next()) {
                    idCurr = r.getInt("id_curr");
                    risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
                }
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumByVotazione(String votoMin, String votoMax) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;

        try {
            r = sVoto.executeQuery();

            while (r.next()) {

                int voto = Integer.parseInt(r.getString("voto").split("/")[0]);
                if (voto <= Integer.parseInt(votoMax) && voto >= Integer.parseInt(votoMin)) {
                    idCurr = r.getInt("id_curr");
                    risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
                }
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<Curriculum> searchCurriculumBySettoreStudio(String settore) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        int idCurr = 0;
        try {
            
            sCurriculumBySettoreStudio.setString(1, "%" + SecurityHelpers.addSlashes(settore.substring(0, settore.length()-1)) + "%");
            r = sCurriculumBySettoreStudio.executeQuery();
            while (r.next()) {
                idCurr = r.getInt("id_curr");
                risultato.add(new Curriculum(idCurr, searchCurriculumById(idCurr)));
            }

            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }

    public Set<String> searchSettoreStudio(String settore) throws ServletException {
        ResultSet r;
        Set risultato = new TreeSet();
        String settStud;
        try {
            
            sCurriculumBySettoreStudio.setString(1, "%" + SecurityHelpers.addSlashes(settore.substring(0, settore.length())) + "%");
            r = sCurriculumBySettoreStudio.executeQuery();
            while (r.next()) {
                settStud = r.getString("settore");
                if (!settStud.isEmpty() && !settStud.equals("")){
                  risultato.add(settStud);
                }
            }
            return risultato;
        } catch (SQLException ex) {
            throw new ServletException("Errore nel cercare i curriculum.", ex);
        }
    }
}
